Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminate artificial supercooled water (rain and cloud) on pressure levels #771

Merged

Conversation

jaymes-kenyon
Copy link
Contributor

@jaymes-kenyon jaymes-kenyon commented Sep 6, 2023

Updates to prevent artificial supercooled rain and cloud water (an aviation hazard) from appearing on pressure levels. This code seeks to fix a problem that was identified/described by Greg Thompson (NCAR) in HRRR pressure-level GRIB2 output. The accompanying figure (linked below) illustrates a scenario in which supercooled rain water can appear in pressure levels when no supercooled rain water is actually present on the adjacent model levels.
isobaric_interpolation.pdf

@jaymes-kenyon
Copy link
Contributor Author

@WenMeng-NOAA @HuiyaChuang-NOAA @EricJames-NOAA Here is a draft PR intended to prevent spurious supercooled rain water from appearing on pressure levels. Testing is still ongoing, but feedback / ideas are welcome. Should this new code only be used for RRFS (i.e., if MODELNAME = FV3R ...)? Thanks!

@WenMeng-NOAA
Copy link
Collaborator

@jaymes-kenyon Do you have an UPP issue for this PR? If not, please open one.

(2) Slight change to freezing-temp threshold (now 273.15 K)
(3) Revised description in comments
(4) Added print statements (temporary)
@jaymes-kenyon
Copy link
Contributor Author

@gthompsnJCSDA : Here's a draft PR to fix the issue of spurious supercooled rain water; comments are welcome.

@jaymes-kenyon
Copy link
Contributor Author

Code has been tested in RRFS 3-km CONUS cases for summer and winter; no GFS tests have been performed.

  • In the summer case, the code results in Qrain adjustments at ~140k grid points on pressure levels (in 3D). Of these adjustments, ~18k (or ~13%) are set to zero (i.e., supercooled rain is eliminated).
  • In the winter case, Qrain adjustments occur at ~193k grid points. Of these, ~11k (or ~6%) are set to zero.

These results suggest instances of supercooled rain on pressure levels arising purely as an interpolation artifact are relatively rare. In other words, instances of supercooled rain on pressure levels (near the melting level) are usually accompanied by explicit supercooled rain on the overlying model level. It's not known whether this is the expected result; ideas or concerns are welcome.

@jaymes-kenyon jaymes-kenyon marked this pull request as ready for review September 11, 2023 19:16
@jaymes-kenyon jaymes-kenyon marked this pull request as draft September 11, 2023 21:45
(2) Applying adjustments to all hydrometeors
@jaymes-kenyon jaymes-kenyon changed the title Eliminate artificial supercooled rain water on pressure levels Eliminate artificial supercooled water (rain and cloud) on pressure levels Sep 12, 2023
@jaymes-kenyon jaymes-kenyon marked this pull request as ready for review September 12, 2023 14:21
@gthompsnJCSDA
Copy link
Contributor

I can think of a really serious potential pitfall. How about the most complex case of more than one crossing (in vertical) of the melting level. I.e., a classic freezing rain profile with the "warm nose?" This really should be checked before proceeding. I believe we would have a really obvious ICICLE case - but I have to check the date, perhaps 2019Feb05.

And I agree if the idea works right for rain, then adapt to cloud water as well. For cloud ice going lower in altitude than melting level, I don't think there would be a problem.

@jaymes-kenyon
Copy link
Contributor Author

jaymes-kenyon commented Sep 12, 2023

I can think of a really serious potential pitfall. How about the most complex case of more than one crossing (in vertical) of the melting level. I.e., a classic freezing rain profile with the "warm nose?" This really should be checked before proceeding. I believe we would have a really obvious ICICLE case - but I have to check the date, perhaps 2019Feb05.

And I agree if the idea works right for rain, then adapt to cloud water as well. For cloud ice going lower in altitude than melting level, I don't think there would be a problem.

Thanks, @gthompsnJCSDA — I mulled the possibility of a "warm nose" and I think this code will handle that situation appropriately, but I am prepared to test further to confirm. Lines 593–595 require a true melting level to proceed; i.e., "cold above, warm below":

                   IF ( TSL(I,J) <= TFRZ .AND.    & ! This pressure level is subfreezing and located just above a melting level;
                        T(I,J,LL-1) <= TFRZ .AND. & ! i.e., the overlying model level is subfreezing,
                        T(I,J,LL) > TFRZ ) THEN     ! but the underlying model level is above freezing.

(note that the LL index increases toward the ground, so LL-1 is actually above LL).

Given this temperature check, a re-freezing level (i.e., "warm above, cold below")—such as would exist at the base of the "warm nose" in a freezing rain situation—will be untouched by this code.

… the interpolated value, whichever is greater. This modified approach is reccomended by G. Thompson in order to retain larger values of snow/graupel whenever these mixing ratios increase downward across the pressure level (e.g., snow growth via cloud-drop collection prior to melting).
@jaymes-kenyon
Copy link
Contributor Author

jaymes-kenyon commented Sep 15, 2023

At the recommendation of @gthompsnJCSDA, I tested this code in a RRFS winter case (8 Feb 2022), then searched for a model column containing a "warm nose" thermal profile with freezing rain at the surface. I found such a column over New England (p = 1002 mb on the lowest-layer midpoint). Using "print" statements, the profiles of temperature (middle column) and Qrain (right column) for 600 mb and below were extracted:

  600 mb   -15.80606     degC  1.0000000E-12
  625 mb   -13.89532     degC  1.0000000E-12
  650 mb   -11.59238     degC  1.0000000E-12
  675 mb   -9.432922     degC  1.0000000E-12
  700 mb   -8.086395     degC  1.0000000E-12
  725 mb   -6.734436     degC  1.0000000E-12
  750 mb   -5.336792     degC  1.0000000E-12
  775 mb   -3.949310     degC  1.6138863E-12
  800 mb   -2.553467     degC  5.9035853E-11
  825 mb   -1.372528     degC  3.3919179E-10
  850 mb  -0.4472656     degC  1.8346782E-08  <- updated
  875 mb   0.4566956     degC  2.6089851E-05
  900 mb    1.366028     degC  8.8202418E-05
  925 mb    1.859070     degC  1.4896749E-04
  950 mb    2.156738     degC  1.8997306E-04
  975 mb    1.247162     degC  2.1207312E-04
 1000 mb  -0.2186890     degC  2.2372934E-04

The warm nose (with T > 0C) spans the ~875–975-mb layer. At 850 mb, the "updated" tag indicates where Qrain was modified from its original interpolated value. Otherwise, all other values of Qrain were unaffected by the code in this PR, including the freezing rain at 1000 mb. This suggests that the code retains supercooled rain beneath re-freezing levels, as intended. Note that the values of Qrain aloft (1.0000000E-12) correspond to the 'zero' value in MDL2P.f; this can be modified to be actual zeros, if desired.

@gthompsnJCSDA
Copy link
Contributor

what about those super tiny amounts of rain at 825 and 800 mb? Those appear possibly interpolated values as well.

@jaymes-kenyon
Copy link
Contributor Author

jaymes-kenyon commented Sep 15, 2023

@gthompsnJCSDA — That's right. In fact, all of the Qrain values in the table above are the interpolated values that the original UPP code is providing, except at 850 mb. The "<-updated" tag at 850 mb indicates that my code supplied this value by extracting it from the overlying model level, overwriting the original interpolation.

Here are some more print statements placed before my code block. First, at 850 mb:

 At requested pressure:          850 mb 
 ...overlying model     P:    844.1834    
 ...overlying model     T:  -0.7026978    
 ...overlying model Qrain:   1.8346782E-08
  ---   
 ...underlying model     P:    862.0761    
 ...underlying model     T:   7.7484131E-02
 ...underlying model Qrain:   5.9126928E-06
   
 *** Interpolated Qrain is :  1.9481072E-06

Here at 850 mb, the interpolated value was later replaced by the value from the overlying model level (two orders of magnitude smaller) as a result of my code (see previous table).

At 825 mb, small amounts of supercooled rain are present on the adjacent model levels; the interpolated value goes unmodified by my code:

 At requested pressure:          825 mb 
 ...overlying model     P:    824.7617    
 ...overlying model     T:   -1.380951    
 ...overlying model Qrain:   1.1281667E-10
  ---  
 ...underlying model     P:    844.1834    
 ...underlying model     T:  -0.7026978    
 ...underlying model Qrain:   1.8346782E-08
   
 *** Interpolated Qrain is :  3.3919179E-10

At 800 mb, very small amounts of supercooled rain are present on the adjacent model levels (again, the interpolated value is retained):

 At requested pressure:          800 mb 
 ...overlying model     P:    781.2208    
 ...overlying model     T:   -3.609955    
 ...overlying model Qrain:   2.1661874E-12
  ---  
 ...underlying model     P:    803.7781    
 ...underlying model     T:   -2.343872    
 ...underlying model Qrain:   7.0317543E-11
   
 *** Interpolated Qrain is :  5.9035853E-11

Hopefully this is insightful. It looks like our proposed code is behaving as intended. Other concerns/ideas?

@jaymes-kenyon
Copy link
Contributor Author

@WenMeng-NOAA — If no further questions/concerns, I think we can continue moving forward with this PR. Testing in RRFS confirms that this code will fix the problem of spurious supercooled water arising purely from interpolation; it leaves most (real) supercooled water intact. No tests have been performed using the GFS. Thanks to @gthompsnJCSDA for helping to describe the original problem and advising on this PR.

@WenMeng-NOAA
Copy link
Collaborator

@WenMeng-NOAA — If no further questions/concerns, I think we can continue moving forward with this PR. Testing in RRFS confirms that this code will fix the problem of spurious supercooled water arising purely from interpolation; it leaves most (real) supercooled water intact. No tests have been performed using the GFS. Thanks to @gthompsnJCSDA for helping to describe the original problem and advising on this PR.

@jaymes-kenyon I will start my testing. Thanks!

@WenMeng-NOAA
Copy link
Collaborator

@jaymes-kenyon Can you sync your branch with the latest UPP develop branch? We will process your PR next. Thanks!

@jaymes-kenyon
Copy link
Contributor Author

@WenMeng-NOAA — I just synched with "develop"; hopefully this helps. Thanks!

@WenMeng-NOAA
Copy link
Collaborator

@jaymes-kenyon During reviewing your PR, I find a bug of cwm initialization in INITPOST_NETCDF.f. Would you mind to pick up my fix and combine in your PR? My fix is at /scratch1/NCEPDEV/stmp2/Wen.Meng/jaymes/UPP/sorc/ncep_post.fd/INITPOST_NETCDF.f

[Wen.Meng@hfe03 ncep_post.fd]$ git status
On branch pressure_interpolation_update
Your branch is up to date with 'origin/pressure_interpolation_update'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   INITPOST_NETCDF.f

Thanks!

@jaymes-kenyon
Copy link
Contributor Author

Good idea, @WenMeng-NOAA — I added checks for each hydrometeor species. Based on line 512, I think that "C1D" can be formulated the same: if C1D exists, then CWM exists, which also means that all five species exist. But, let me know if I am mistaken. You bug fix has also been added to the PR.

@WenMeng-NOAA
Copy link
Collaborator

Good idea, @WenMeng-NOAA — I added checks for each hydrometeor species. Based on line 512, I think that "C1D" can be formulated the same: if C1D exists, then CWM exists, which also means that all five species exist. But, let me know if I am mistaken. You bug fix has also been added to the PR.

@jaymes-kenyon Looks good for me. Thanks!

@WenMeng-NOAA
Copy link
Collaborator

The UPP RT indicate changed results of these MP variables on isobaric levels for GFS, RRFS, 3DRTMA and HAFS such as:

gfs:  gfs.20190830/gfs.t00z.master.grb2f006
493:1277344354:CLMR:500 mb:rpn_corr=0.999999:rpn_rms=5.8857e-08
495:1278718847:RWMR:500 mb:rpn_corr=0.999853:rpn_rms=2.00914e-10
509:1321693641:CLMR:525 mb:rpn_corr=0.999724:rpn_rms=1.35698e-06
510:1322077105:ICMR:525 mb:rpn_corr=0.999997:rpn_rms=5.70781e-09
511:1323177936:RWMR:525 mb:rpn_corr=0.918638:rpn_rms=3.71626e-08
512:1323192010:SNMR:525 mb:rpn_corr=0.999953:rpn_rms=7.95879e-07
541:1412183285:CLMR:575 mb:rpn_corr=0.997774:rpn_rms=4.23497e-06
542:1412654320:ICMR:575 mb:rpn_corr=0.997294:rpn_rms=1.21677e-07
543:1413607815:RWMR:575 mb:rpn_corr=0.99955:rpn_rms=9.61382e-08
544:1413741913:SNMR:575 mb:rpn_corr=0.999704:rpn_rms=1.74645e-06
545:1414900843:GRLE:575 mb:rpn_corr=0.999999:rpn_rms=3.9135e-09
...

RRFS: fv3r_2023062800/PRSLEV10.tm00.diff
425:379040095:RWMR:500 mb:rpn_corr=0.999915:rpn_rms=2.71782e-07
438:394290403:CLMR:525 mb:rpn_corr=0.999966:rpn_rms=2.93396e-07
439:394397871:ICMR:525 mb:rpn_corr=0.999999:rpn_rms=7.27848e-10
440:394570609:RWMR:525 mb:rpn_corr=0.99921:rpn_rms=8.47557e-07
442:394692533:GRLE:525 mb:rpn_corr=0.999963:rpn_rms=7.90778e-07
453:409902027:CLMR:550 mb:rpn_corr=0.999229:rpn_rms=1.66224e-06
455:410166644:RWMR:550 mb:rpn_corr=0.998717:rpn_rms=1.21641e-06
456:410178311:SNMR:550 mb:rpn_corr=0.999979:rpn_rms=7.39704e-07
457:410291276:GRLE:550 mb:rpn_corr=0.999938:rpn_rms=1.00225e-06
468:425758237:CLMR:575 mb:rpn_corr=0.998616:rpn_rms=2.59907e-06
469:425898238:ICMR:575 mb:rpn_corr=0.999649:rpn_rms=3.98602e-09
470:426032130:RWMR:575 mb:rpn_corr=0.990812:rpn_rms=3.87284e-06
471:426047312:SNMR:575 mb:rpn_corr=0.999704:rpn_rms=2.47564e-06
472:426152535:GRLE:575 mb:rpn_corr=0.999072:rpn_rms=3.79369e-06
483:440837063:CLMR:600 mb:rpn_corr=0.996896:rpn_rms=4.37183e-06
484:440992321:ICMR:600 mb:rpn_corr=0.988521:rpn_rms=8.98694e-09
...

@jaymes-kenyon I would think the above changes are expected. You may look at RRFS tests at


- With your changes at /scratch1/NCEPDEV/stmp2/Wen.Meng/fv3r_2023062800 on Hera.
- Without your changes (baseline) at /scratch2/NCEPDEV/ovp/Wen.Meng/ncep_post/post_regression_test_new/data_out/fv3r


Please let me know if you see issues from my testing.

@jaymes-kenyon
Copy link
Contributor Author

Hey @WenMeng-NOAA — These tests look good to me. All of the changes that were found would be expected. Thanks for the update!

@WenMeng-NOAA
Copy link
Collaborator

Hey @WenMeng-NOAA — These tests look good to me. All of the changes that were found would be expected. Thanks for the update!

@jaymes-kenyon Thanks for confirming.

@WenMeng-NOAA
Copy link
Collaborator

The UPP RTs were completed on WCOSS2. There will be new baselines needed for gfs, fv3r, 3drtma and hafs with this PR.

hafs:
-rw-r--r-- 1 wen.meng emc  5293 Sep 25 13:02 fv3hafs_2022092800/HURPRS09.tm00.diff
3drtma:
-rw-r--r-- 1 wen.meng emc  6503 Sep 25 13:02 rtma_2023040400/PRSLEV00.tm00.diff
fv3r:
-rw-r--r-- 1 wen.meng emc  4005 Sep 25 13:02 fv3r_2023062800/PRSLEV10.tm00.diff
gfs:
-rw-r--r-- 1 wen.meng emc  8435 Sep 25 13:13 gfs.20190830/gfs.t00z.master.grb2f006.diff

@WenMeng-NOAA WenMeng-NOAA added Ready for Review This PR is ready for code review. Baseline Change The baselines of the UPP regression tests are changed. labels Sep 25, 2023
@WenMeng-NOAA
Copy link
Collaborator

@FernandoAndrade-NOAA You may start the UPP RT on Orion. See the baseline changes above.
The new baselines on Hera can be copied from my testing at /scratch1/NCEPDEV/stmp2/Wen.Meng:
gfs.20190830/
rtma_2023040400/
fv3r_2023062800/
fv3hafs_2022092800/

@FernandoAndrade-NOAA
Copy link
Collaborator

@FernandoAndrade-NOAA You may start the UPP RT on Orion. See the baseline changes above. The new baselines on Hera can be copied from my testing at /scratch1/NCEPDEV/stmp2/Wen.Meng: gfs.20190830/ rtma_2023040400/ fv3r_2023062800/ fv3hafs_2022092800/

UPP RTs have completed successfully on Orion, changes in results are consistent with the ones mentioned above for 3drtma, fv3r, fv3hafs, and gfs

@WenMeng-NOAA
Copy link
Collaborator

This PR is ready for merging.

@WenMeng-NOAA WenMeng-NOAA merged commit 998c2fe into NOAA-EMC:develop Sep 25, 2023
@jaymes-kenyon jaymes-kenyon deleted the pressure_interpolation_update branch September 25, 2023 16:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Baseline Change The baselines of the UPP regression tests are changed. GFSV17 HAFS Ready for Review This PR is ready for code review. RRFS
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Pressure-level interpolation may produce artificial supercooled rain water
5 participants